package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.service.IPermissionService;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

//拦截权限
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    /*
    * 1.浏览器请求
    * 2.登陆拦截器
    * 3.权限拦截器
    * 4.判断是否是超管：是则直接放行，不是则
    * 5.判断是否有贴自定义权限注解：没有则放行，有则获取自定义权限注解中的权限表达式
    * 6.查询数据库中所有的权限信息（权限表达式集合）
    * 7.判断权限表达式集合中是否包含这个注解中的权限表达式，有则允许点击进入相应的页面，没有则进入nopermission.ftl页面
    * */
    @Lazy//Permission不会管这个类何时创建，运行到这个类的时候，这个对象为空的时候也不影响
    @Autowired
    private IPermissionService permissionService;
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //从session获取用户信息
        //boolean类型且是基本类型属性是isAdmin();Boolean类性且引用属性是getAdmin()
        //Employee employee =(Employee) request.getSession().getAttribute("USER_IN_SESSION");
        Employee employee = UserContext.getCurrentUser();
        //判断是否超管
        if (employee.isAdmin()) {
            return true;
        }

        //静态资源的访问的放行
        if(!(handler instanceof HandlerMethod)){
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;

        //判断是否贴有自定义权限注解
        RequiredPermission annotation = handlerMethod.getMethodAnnotation(RequiredPermission.class);
        if (annotation == null){
            return true;
        }
        //获取注解中的表达式
        String expression = annotation.expression();
        //获取数据库中所有的权限表达式
        //List<String> stringList = permissionService.selectByEmpId(employee.getId());
        //List<String> expressions =(List<String>) request.getSession().getAttribute("PERMISSION_IN_SESSION");
        List<String> expressions = UserContext.getPermission();
        //判断权限表达式集合中是否包含这个注解中的权限表达式
        if (expressions.contains(expression)){
            return true;
        }
        //没有权限访问
        response.sendRedirect("/emp/nopermission");
        return false;//不放行
    }
}
